#include <iostream>
#include <vector>
#include <cstring>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
using namespace std;

// void *threadhandler(void *arg)
// {
//     int newsock = *((int *)arg);
// }

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        cout << "use error, " << argv[0] << " port" << endl;
    }

    uint16_t port = stoi(argv[1]);

    int fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd == -1)
    {
        cout << "socket error" << endl;
        return 1;
    }

    struct sockaddr_in addr;
    bzero(&addr, sizeof(addr));
    socklen_t len = sizeof(addr);
    addr.sin_port = htons(port);
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = INADDR_ANY;

    // struct sockaddr_in addr;
    // memset(&addr, 0, sizeof(addr));
    // // addr.sin_addr.s_addr = inet_addr(_ip.c_str());
    // addr.sin_addr.s_addr = INADDR_ANY;
    // addr.sin_port = htons(port);
    // addr.sin_family = AF_INET;

    int n = bind(fd, (struct sockaddr *)&addr, sizeof(addr));

    if (n < 0)
    {
        cout << "bind error" << endl;
        return 1;
    }

    n = listen(fd, 5);
    vector<int> fd_list;
    while (true)
    {
        int newsock = accept(fd, (struct sockaddr *)&addr, &len);
        if (newsock < 0)
        {
            cout << "accept errno" << endl;
        }
        else
        {
            cout << "新连接到来" << endl;
            fd_list.push_back(newsock);
            cout << "已建立连接的文件描述符：";
            for (auto e : fd_list)
            {
                cout << e << " ";
            }
            cout << endl;
            int pid = fork();
            if (pid == 0)
            {
                // child
                int sock = newsock;
                char buffer[1024];
                while (true)
                {
                    ssize_t ret = recv(sock, buffer, sizeof(buffer) - 1, 0);
                    if (ret > 0)
                    {
                        buffer[ret] = 0;
                        cout << "client say# " << buffer << endl;
                        ret = send(sock, buffer, strlen(buffer), 0);
                    }
                }
            }
        }
    }

    return 0;
}

// #include <iostream>
// #include <vector>
// #include <cstring>
// #include <unistd.h>
// #include <sys/types.h>
// #include <sys/socket.h>
// #include <netinet/in.h>
// #include <arpa/inet.h>
// #include <pthread.h>
// using namespace std;

// void *threadhandler(void *arg)
// {
//     int newsock = *((int *)arg);
//     char buffer[1024];
//     while (true)
//     {
//         ssize_t ret = recv(newsock, buffer, sizeof(buffer) - 1, 0);
//         if (ret > 0)
//         {
//             buffer[ret] = 0;
//             cout << "client say# " << buffer << endl;
//             ret = send(newsock, buffer, strlen(buffer), 0);
//         }
//     }
// }

// int main(int argc, char *argv[])
// {
//     if (argc != 2)
//     {
//         cout << "use error, " << argv[0] << " port" << endl;
//     }

//     uint16_t port = stoi(argv[1]);

//     int fd = socket(AF_INET, SOCK_STREAM, 0);
//     if (fd == -1)
//     {
//         cout << "socket error" << endl;
//         return 1;
//     }

//     struct sockaddr_in addr;
//     bzero(&addr, sizeof(addr));
//     socklen_t len = sizeof(addr);
//     addr.sin_port = htons(port);
//     addr.sin_family = AF_INET;
//     addr.sin_addr.s_addr = INADDR_ANY;

//     // struct sockaddr_in addr;
//     // memset(&addr, 0, sizeof(addr));
//     // // addr.sin_addr.s_addr = inet_addr(_ip.c_str());
//     // addr.sin_addr.s_addr = INADDR_ANY;
//     // addr.sin_port = htons(port);
//     // addr.sin_family = AF_INET;

//     int n = bind(fd, (struct sockaddr *)&addr, sizeof(addr));

//     if (n < 0)
//     {
//         cout << "bind error" << endl;
//         return 1;
//     }

//     n = listen(fd, 5);
//     vector<int> fd_list;
//     while (true)
//     {
//         int newsock = accept(fd, (struct sockaddr *)&addr, &len);
//         if (newsock < 0)
//         {
//             cout << "accept errno" << endl;
//         }
//         else
//         {
//             cout << "新连接到来" << endl;
//             fd_list.push_back(newsock);
//             cout << "已建立连接的文件描述符：";
//             for (auto e : fd_list)
//             {
//                 cout << e << " ";
//             }
//             cout << endl;
//             pthread_t pid;
//             pthread_create(&pid, nullptr, threadhandler, (void *)&newsock);
//             pthread_detach(pid);
//         }
//     }

//     return 0;
// }